package com.liu.network.ip.bean;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.HttpURLConnection;
import java.net.URL;

/**
 * @Description: 下载远程文件到本地。
 */
public class RemoteFile {
	private String remoteFileUrl;
	private String saveFilePath;

	public RemoteFile(String remoteFileUrl, String saveFilePath) {
		this.remoteFileUrl = remoteFileUrl;
		this.saveFilePath = saveFilePath;
	}

	/**
	 * @Name: downRemoteFile。
	 * @Description: 下载远程文件。
	 * @Parameters: remoteFileUrl，要下载的远程文件地址。
	 * @Parameters: saveFilePath，下载后保存的地址。
	 */
	public void downRemoteFile() {
		FileUtil fileUtil = new FileUtil();
		System.out.println("IP库网址地址 "+remoteFileUrl);
		System.out.println("压缩包保存地址 "+saveFilePath);
		long time = System.currentTimeMillis();
		HttpURLConnection conn = null;
		OutputStream out = null;
		InputStream in = null;

		try {
			// 创建保存的文件
			File file = fileUtil.initFile(saveFilePath);

			URL url = new URL(remoteFileUrl);
			// 将url以open方法返回的urlConnection连接强转为HttpURLConnection连接(标识一个url所引用的远程对象连接)
			// 此时cnnection只是为一个连接对象,待连接中
			conn = (HttpURLConnection) url.openConnection();
			// 设置是否要从 URL连接读取数据,默认为true
			conn.setDoInput(true);
			// 建立连接
			// (请求未开始,直到connection.getInputStream()方法调用时才发起,以上各个参数设置需在此方法之前进行)
			conn.connect();
			// 连接发起请求,处理服务器响应 (从连接获取到输入流)
			in = conn.getInputStream();
			// 创建文件输出流，用于保存下载的远程文件
			out = new FileOutputStream(file);
			// 用来存储响应数据
			byte[] buffer = new byte[4 * 1024];
			int byteRead = -1;
			// 循环读取流
			while ((byteRead = in.read(buffer)) != -1) {
				out.write(buffer, 0, byteRead);
			}
			// 输出完成后刷新并关闭流
			out.flush();
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (in != null) {
					in.close();
				}
				if (out != null) {
					out.close();
				}
				if (conn != null) {
					conn.disconnect();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
		System.out.println("去IP库"+remoteFileUrl+"\n下载压缩包耗时：" + (System.currentTimeMillis() - time) + "ms");
	}

}